home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / genblitter.c < prev    next >
C/C++ Source or Header  |  1996-08-18  |  16KB  |  401 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Optimized blitter minterm function generator
  5.   * 
  6.   * Copyright 1995,1996 Bernd Schmidt
  7.   * Copyright 1996 Alessandro Bissacco
  8.   */
  9.  
  10. #include "sysconfig.h"
  11. #include "sysdeps.h"
  12.  
  13. #include "config.h"
  14. #include "options.h"
  15. /*#include "custom.h"*/
  16.  
  17. UWORD dmacon;
  18. /* Here is the minterm table used in blitter function generation */
  19.  
  20. static unsigned char blttbl[]= {
  21.     0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8,
  22.     0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc
  23. };
  24.  
  25. static int bitset(int mt, int bit)
  26. {
  27.     return mt & (1<<bit);
  28. }
  29.  
  30. static int generate_expr(int minterm, int print)
  31. {
  32.     int result = 0;
  33.     int firstor = 1;
  34.     int bits = 0;
  35.     int i;
  36.     for(i=0; i<8; i++) {
  37.     if (bitset(minterm, i) && !bitset(bits,i)) {
  38.         int j;
  39.         int dontcare = 0;
  40.         int firstand = 1;
  41.         int bitbucket[8], bitcount;
  42.         
  43.         bits |= 1<<i;
  44.              bitcount = 1; bitbucket[0] = i;
  45.         for(j=1; j<8; j *= 2) {
  46.         int success = 1;
  47.         int k;
  48.         for(k=0; k < bitcount; k++) {            
  49.             if (!bitset(minterm, bitbucket[k] ^ j)) {
  50.             success = 0;
  51.             }
  52.         }
  53.         if (success) {
  54.             int l;
  55.             dontcare |= j;
  56.             for(l=bitcount; l < bitcount*2; l++) {
  57.             bitbucket[l] = bitbucket[l-bitcount] ^ j;
  58.             bits |= 1 << bitbucket[l];
  59.             }
  60.             bitcount *= 2;
  61.         }
  62.         }
  63.         if (firstor) {
  64.         firstor = 0;
  65.         } else {
  66.         if (print) printf(" | ");
  67.         }
  68.         for (j=1; j<8; j *= 2) {
  69.         if (!(dontcare & j)) {
  70.             if (firstand) {
  71.             firstand = 0;
  72.             if (print) printf("(");
  73.             } else {
  74.             if (print) printf(" & ");
  75.             }
  76.             if (!(i & j))
  77.             if (print) printf("~");
  78.             if (print) printf("src%c", (j == 1 ? 'c' : j == 2 ? 'b' : 'a'));
  79.             result |= (j == 1 ? 4 : j == 2 ? 2 : 1);
  80.         }
  81.         }
  82.         if (!firstand) {            
  83.         if (print) printf(")");
  84.         } else {
  85.         if (print) printf("0xFFFF");
  86.         }
  87.     }
  88.     }
  89.     if (firstor)
  90.     if (print) printf("0");
  91.     if (print) printf(";\n");
  92.     return result;
  93. }
  94.  
  95. static void generate_include(void)
  96. {
  97.     int minterm;
  98.     printf("static __inline__ ULONG blit_func(ULONG srca, ULONG srcb, ULONG srcc, UBYTE mt)\n{\nswitch(mt){\n");
  99.     for (minterm = 0; minterm < 256; minterm++) {
  100.     printf("case 0x%x:\n", minterm);
  101.     printf("\treturn ");
  102.     generate_expr(minterm, 1);
  103.     }
  104.     printf("}\n");
  105.     printf("return 0;\n"); /* No, sir, it doesn't! */
  106.     printf("}\n");
  107. }
  108.  
  109. static void generate_func(void)
  110. {
  111.     unsigned int i;
  112.     printf("#include \"sysconfig.h\"\n");
  113.     printf("#include \"sysdeps.h\"\n");
  114.     printf("#include \"config.h\"\n");
  115.     printf("#include \"options.h\"\n");
  116.     printf("#include \"custom.h\"\n");
  117.     printf("#include \"blitter.h\"\n");
  118.     printf("#include \"blitfunc.h\"\n\n");
  119.  
  120.     for (i = 0; i < sizeof(blttbl); i++) { 
  121.     int active = generate_expr(blttbl[i],0); 
  122.     int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4; 
  123.     
  124.     printf("void blitdofast_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]); 
  125.     printf("{\n");
  126.     printf("int i,j;\n"); 
  127.     
  128. #if FAST_BLITTER == 3 || FAST_BLITTER == 5
  129.     printf("if (b->hblitsize>1");
  130.     if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); 
  131.     if (b_is_on) printf(" && !b->blitbshift"); 
  132.     printf(") {\n"); 
  133.     if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n");
  134.     if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n"); 
  135.     if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
  136.     printf("ULONG dest;\n"); 
  137.     printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
  138.     printf("for (j=0;j<b->vblitsize;j++) {\n"); 
  139.     printf("\tfor(i=0;i<count;i++) {\n"); 
  140.     if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)pta); pta += 4;}\n");
  141.     if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)ptb); ptb += 4;}\n"); 
  142.     if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)ptc); ptc += 4;}\n");
  143.     printf("\t\tdest="); 
  144.     generate_expr(blttbl[i],1);
  145.     printf("\t\tif (dest) b->blitzero=0;\n"); 
  146.     printf("\t\tif (ptd) {*(ULONG *)ptd=dest; ptd += 4;}\n");
  147.     printf("\t}\n");
  148.     printf("\tif (oddword) {\n");
  149.     if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta += 2; }\n"); 
  150.     if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb += 2; }\n"); 
  151.     if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc += 2; }\n");
  152.     printf("\t\tdest="); 
  153.     generate_expr(blttbl[i],1);
  154.     printf("\t\tif (dest) b->blitzero=0;\n"); 
  155.     printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd += 2; }\n");
  156.     printf("\t}\n");
  157.     if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n"); 
  158.     if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n"); 
  159.     if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
  160.     printf("\tif (ptd) ptd += b->bltdmod;\n"); 
  161.     printf("}\n");
  162.     if (a_is_on) printf("if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);\n"); /* Maybe not necessary, but I don't want problems */ 
  163.     if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n");
  164.     if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n");
  165.     printf("if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n");
  166.     
  167.     printf("} else\n"); 
  168. #endif
  169.     printf("{\n");
  170.     
  171.     printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
  172.     if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
  173.     printf("for (j=0;j<b->vblitsize;j++) {\n");
  174.     if (a_is_on) {
  175.         printf("\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
  176.         if (b_is_on) printf("\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
  177.         if (c_is_on) printf("\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; };\n");
  178.         printf("\tbltaold=b->bltadat & bltamask;\n");     
  179.             printf("\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n");
  180.         if (b_is_on) printf("\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n");
  181.         if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
  182.         printf("\tb->bltddat=");
  183.         generate_expr(blttbl[i],1);
  184.         printf("\tb->blitpreva=bltaold;\n");
  185.         if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
  186.         printf("\tif (b->bltddat) b->blitzero=0;\n");
  187.         printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
  188.     }
  189.     if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
  190.     else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
  191.     if (a_is_on) printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
  192.     if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
  193.     if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n");
  194.         if (a_is_on) printf("\t\tsrca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;\n");
  195.     if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n");
  196.     if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
  197.     printf("\t\tb->bltddat=");
  198.     generate_expr(blttbl[i],1);
  199.     if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
  200.     if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
  201.     printf("\t\tif (b->bltddat) b->blitzero=0;\n");
  202.     printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
  203.     printf("\t}\n");
  204.     if (a_is_on) {
  205.         printf("\tif (b->hblitsize>1) {\n");
  206.         printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
  207.         if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
  208.         if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n");
  209.         printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");     
  210.             printf("\t\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n");
  211.         if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n");
  212.         if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
  213.         printf("\t\tb->bltddat=");
  214.         generate_expr(blttbl[i],1);
  215.         printf("\t\tb->blitpreva=bltaold;\n");
  216.         if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
  217.         printf("\t\tif (b->bltddat) b->blitzero=0;\n");
  218.         printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
  219.         printf("\t}\n");
  220.     }
  221.     if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
  222.     if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
  223.     if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
  224.     printf("\tif (ptd) ptd+=b->bltdmod;\n");
  225.     printf("}\n");
  226.     printf("}\n");
  227.     printf("}\n");
  228.     
  229.     
  230.     printf("void blitdofast_desc_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]);
  231.     printf("{\n");
  232.     printf("int i,j;\n");
  233.     
  234. #if FAST_BLITTER == 3 || FAST_BLITTER == 5
  235.     printf("if (b->hblitsize>1");
  236.     if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); 
  237.     if (b_is_on) printf(" && !b->blitbshift"); 
  238.     printf(") {\n"); 
  239.     if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n");
  240.     if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n"); 
  241.     if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
  242.     printf("ULONG dest;\n"); 
  243.     printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
  244.     printf("for (j=0;j<b->vblitsize;j++) {\n"); 
  245.     printf("\tfor(i=0;i<count;i++) {\n"); 
  246.     if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)(pta-2)); pta -= 4;}\n");
  247.     if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)(ptb-2)); ptb -= 4;}\n"); 
  248.     if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)(ptc-2)); ptc -= 4;}\n");
  249.     printf("\t\tdest="); 
  250.     generate_expr(blttbl[i],1);
  251.     printf("\t\tif (dest) b->blitzero=0;\n"); 
  252.     printf("\t\tif (ptd) {*(ULONG *)(ptd-2)=dest; ptd -= 4;}\n");
  253.     printf("\t}\n"); 
  254.     printf("\tif (oddword) {\n");
  255.     if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta -= 2; }\n");
  256.     if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb -= 2; }\n"); 
  257.     if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc -= 2; }\n");
  258.     printf("\t\tdest="); 
  259.     generate_expr(blttbl[i],1);
  260.     printf("\t\tif (dest) b->blitzero=0;\n"); 
  261.     printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd -= 2; }\n");
  262.     printf("\t}\n");
  263.     if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n"); 
  264.     if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n"); 
  265.     if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
  266.     printf("\tif (ptd) ptd-=b->bltdmod;\n"); 
  267.     printf("}\n");
  268.     if (a_is_on) printf("if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);\n"); /* Maybe not necessary, but I don't want problems */
  269.     if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n");
  270.     if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n");
  271.     printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n");
  272.     
  273.     printf("} else\n"); 
  274. #endif
  275.     printf("{\n");
  276.     
  277.     printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
  278.     if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
  279.     printf("for (j=0;j<b->vblitsize;j++) {\n");
  280.     if (a_is_on) {
  281.         printf("\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
  282.         if (b_is_on) printf("\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
  283.         if (c_is_on) printf("\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
  284.         printf("\tbltaold=b->bltadat & bltamask;\n");     
  285.             printf("\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
  286.         if (b_is_on) printf("\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
  287.         if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
  288.         printf("\tb->bltddat=");
  289.         generate_expr(blttbl[i],1);
  290.         printf("\tb->blitpreva=bltaold;\n");
  291.         if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
  292.         printf("\tif (b->bltddat) b->blitzero=0;\n");
  293.         printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
  294.     }
  295.     if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
  296.     else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
  297.     if (a_is_on) printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
  298.     if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
  299.     if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
  300.         if (a_is_on) printf("\t\tsrca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);\n");
  301.     if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
  302.     if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
  303.     printf("\t\tb->bltddat=");
  304.     generate_expr(blttbl[i],1);
  305.     if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
  306.     if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
  307.     printf("\t\tif (b->bltddat) b->blitzero=0;\n");
  308.     printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
  309.     printf("\t}\n");
  310.     if (a_is_on) {
  311.         printf("\tif (b->hblitsize>1) {\n");
  312.         printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
  313.         if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
  314.         if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
  315.         printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");     
  316.             printf("\t\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
  317.         if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
  318.         if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
  319.         printf("\t\tb->bltddat=");
  320.         generate_expr(blttbl[i],1);
  321.         printf("\t\tb->blitpreva=bltaold;\n");
  322.         if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
  323.         printf("\t\tif (b->bltddat) b->blitzero=0;\n");
  324.         printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
  325.         printf("\t}\n");
  326.     }
  327.     if (a_is_on) printf("\tif (pta) pta-=b->bltamod;\n");
  328.     if (b_is_on) printf("\tif (ptb) ptb-=b->bltbmod;\n");
  329.     if (c_is_on) printf("\tif (ptc) ptc-=b->bltcmod;\n");
  330.     printf("\tif (ptd) ptd-=b->bltdmod;\n");
  331.     printf("}\n");
  332.     printf("}\n");
  333.     printf("}\n");
  334.     }
  335. }
  336.      
  337. static void generate_table(void)
  338. {
  339.     unsigned int index = 0;
  340.     unsigned int i;
  341.     printf("#include \"sysconfig.h\"\n");
  342.     printf("#include \"sysdeps.h\"\n");
  343.     printf("#include \"config.h\"\n");
  344.     printf("#include \"options.h\"\n");
  345.     printf("#include \"custom.h\"\n");
  346.     printf("#include \"blitter.h\"\n");
  347.     printf("#include \"blitfunc.h\"\n\n");
  348.     printf("blitter_func *blitfunc_dofast[256] = {\n");
  349.     for (i = 0; i < 256; i++) {
  350.     if (index < sizeof(blttbl) && i == blttbl[index]) {
  351.         printf("blitdofast_%x",i);
  352.         index++;
  353.     }
  354.     else printf("0");
  355.     if (i < 255) printf(", ");
  356.     if ((i & 7) == 7) printf("\n");
  357.     }
  358.     printf("};\n\n");
  359.     
  360.     index = 0;
  361.     printf("blitter_func *blitfunc_dofast_desc[256] = {\n");
  362.     for (i = 0; i < 256; i++) {
  363.     if (index < sizeof(blttbl) && i == blttbl[index]) {
  364.         printf("blitdofast_desc_%x",i);
  365.         index++;
  366.     }
  367.     else printf("0");
  368.     if (i < 255) printf(", ");
  369.     if ((i & 7) == 7) printf("\n");
  370.     }
  371.     printf("};\n");
  372. }
  373.  
  374. static void generate_header(void)
  375. {
  376.     unsigned int i;
  377.     for (i = 0; i < sizeof(blttbl); i++) {
  378.     printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
  379.     printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
  380.     }
  381. }
  382.  
  383. int main(int argc, char **argv)
  384. {
  385.     char mode = 'i';
  386.     if (argc == 2) mode = *argv[1];
  387.     switch (mode) {
  388.      case 'i': generate_include();
  389.            break;
  390.      case 'f': generate_func();
  391.            break;
  392.      case 't': generate_table();
  393.            break;
  394.      case 'h': generate_header();
  395.            break;
  396.      default: abort();
  397.     }
  398.     return 0;
  399. }
  400.  
  401.